package com.kongjs.application.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kongjs.application.convert.LoginLogConverter;
import com.kongjs.application.model.dto.*;
import com.kongjs.application.model.entity.LoginLog;
import com.kongjs.application.mapper.LoginLogMapper;
import com.kongjs.application.service.ILoginLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kongjs.application.util.PageUtil;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

@Transactional
@Service
public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper, LoginLog> implements ILoginLogService {
    @Resource
    private LoginLogConverter loginLogConverter;

    @Override
    public PageDTO<QueryLoginLogDTO> page(PageQueryDTO dto, QueryLoginParamDTO paramDTO) {
        Page<LoginLog> page;
        if (!ObjectUtils.isEmpty(paramDTO)) {
            page = lambdaQuery()
                    .eq(StringUtils.hasText(paramDTO.getLoginResult()), LoginLog::getLoginResult, paramDTO.getLoginResult())
                    .eq(!ObjectUtils.isEmpty(paramDTO.getUserId()), LoginLog::getUserId, paramDTO.getUserId())
                    .like(StringUtils.hasText(paramDTO.getUserName()), LoginLog::getUserName, paramDTO.getUserName())
                    .like(StringUtils.hasText(paramDTO.getLoginIpaddr()), LoginLog::getLoginIpaddr, paramDTO.getLoginIpaddr())
                    .like(StringUtils.hasText(paramDTO.getLoginIpinfo()), LoginLog::getLoginIpinfo, paramDTO.getLoginIpinfo())
                    .between(!ObjectUtils.isEmpty(paramDTO.getStartDate()) && !ObjectUtils.isEmpty(paramDTO.getEndDate()), LoginLog::getLoginTime, paramDTO.getStartDate(), paramDTO.getEndDate())
                    .orderByDesc(LoginLog::getLoginTime)
                    .page(Page.of(dto.getPageNum(), dto.getPageSize()));
        } else {
            page = lambdaQuery()
                    .orderByDesc(LoginLog::getLoginTime)
                    .page(Page.of(dto.getPageNum(), dto.getPageSize()));
        }
        IPage<QueryLoginLogDTO> iPage = page.convert(loginLog -> loginLogConverter.toDto(loginLog));
        return PageUtil.pageDto(iPage);
    }
}
